import { IHook, Ictr } from '../types'

const tips = (message: string, type: string = 'error') => {
  if (type == 'success') {
    console.log(message)
  } else {
    console.warn(message)
  }
}

/**
 * 请求异常处理
 * @param error
 */
function requestExceptionHandling(error: any, ctr: Ictr): Promise<any> {
  if (!ctr.isErrorTip) return Promise.reject(error)
  if (error.name == 'AbortError') return Promise.reject(error)
    
  switch (error.status) {
    case 500:
      tips('服务器内部错误')
      break
    case 404:
      tips('接口地址不存在')
      break
    case 408:
      tips('请求超时')
      break
    default:
      tips('服务器异常')
      break
  }
  return Promise.reject(error)
}

let resetLogin = false
/**
 * 业务请求逻辑异常处理
 * @param error
 */
function responseLogicExceptionHandling(res: any, ctr: Ictr): Promise<any> {
  if (res === '' && ctr.isErrorTip) {
    tips('服务器返回异常')
    return Promise.reject(res)
  }

  const code = res.code
  if (code == 10000) {
    if (resetLogin) {
      console.log('已重定向')
      return Promise.reject(res)
    }
    tips('登录失效需重新登录')
    return Promise.reject(res)
  } else if (ctr.isErrorTip) {
    let message = res.message || res.msg || '请求失败'
    tips(message)
  }

  return Promise.reject(res)
}

/**响应数据处理中间件 */
export const resultHandelHook: IHook = {
  request() {},
  async response({ originalData, ctr }) {
    const resData: Response = originalData.data
    // 请求或响应异常处理
    if (originalData.status == 'error') {
      return requestExceptionHandling(resData, ctr)
    }

    if (ctr.isOrigina) return originalData.data
    const contentType = resData.headers.get('Content-Type')
    if (contentType) {
      if (contentType.includes('json')) {
        const res = await resData.json()
        if (res && res.code === 0) {
          if (ctr.isOkTip) {
            tips(res.msg || res.message || res.data || '请求成功', 'success')
          }
          return res.data ? res.data : null
        }
        return responseLogicExceptionHandling(res, ctr)
      }
      if (contentType.includes('text')) {
        const res = await resData.text()
        return responseLogicExceptionHandling(res, ctr)
      }
    }
    return resData
  }
}
